# 编译器设置
CXX := g++
CXXFLAGS := -std=c++11 -Wall -Wextra -g -pedantic -I.
LDFLAGS := 
TARGET := program

# 中间文件存储目录
OBJ_DIR := obj
DEP_DIR := dep

# 自动获取所有源文件和头文件
SRCS := $(wildcard *.cpp)
HDRS := $(wildcard *.h *.hpp)
OBJS := $(addprefix $(OBJ_DIR)/, $(SRCS:.cpp=.o))
DEPS := $(addprefix $(DEP_DIR)/, $(SRCS:.cpp=.d))

# 确保目录存在
$(shell mkdir -p $(OBJ_DIR) >/dev/null)
$(shell mkdir -p $(DEP_DIR) >/dev/null)

# 默认目标 - 构建并自动清理
all: $(TARGET)
	@echo "Build successful. Cleaning temporary files..."
	@$(MAKE) clean-temp

# 主目标链接
$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@

# 包含自动生成的依赖关系
-include $(DEPS)

# 模式规则：编译.cpp文件为.o文件（存储到obj目录）
$(OBJ_DIR)/%.o: %.cpp
	$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@ -MF $(DEP_DIR)/$*.d

# 清理所有生成的文件（包括目标文件和可执行文件）
clean:
	rm -rf $(TARGET) $(OBJ_DIR) $(DEP_DIR) *.gch *~ *.bak *.tmp
	@echo "All generated files and directories cleaned."

# 清理临时文件（保留.o和.d文件）
clean-temp:
	rm -f *.gch *~ *.bak *.tmp
	@echo "Temporary files cleaned. Object and dependency files preserved for incremental builds."

# 重新构建：先清理再编译
rebuild: clean all

# 说明：
# make          : 编译项目并自动清理临时文件
# make all      : 同上
# make clean    : 清理所有生成的文件和目录
# make rebuild  : 完全重新构建项目
.PHONY: all clean clean-temp rebuild
